﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAL.conn
{
    public   class SQLHelper
    {
        public static string connString = ConfigurationManager.ConnectionStrings["Conn"].ConnectionString;//根据配置文件的节点名称进行数据库连接（节点名：StrCon）
        public static SqlConnection conn = new SqlConnection(connString);//实例化(初始化)数据库连接
        /// <summary>
        /// 返回影响的数据行数（一般用于数据库修改操作方法）
        /// </summary>
        public static int ExecuteSQL(SqlCommand cmd)
        {
            cmd.Connection = conn;//建立对象数据连接
            int num = 0;
            try
            {
                conn.Open();//打开数据库连接
                num = cmd.ExecuteNonQuery();//调用SqlCommand对象的ExecuteNonQuery方法，并返回受影响的行数
            }
            catch (Exception ex)
            {
                throw new DBException(ex);
            }
            finally
            {
                if (conn.State == ConnectionState.Open)//判断数据库连接状态是否为打开状态
                {
                    conn.Close();//关闭数据库连接
                }
            }
            return num;
        }
        public static DataSet GetDataSet(SqlCommand cmd)
        {
            conn = new SqlConnection(connString );
            cmd.Connection = conn;
            SqlDataAdapter dt = new SqlDataAdapter(cmd);//实例化一个数据适配器，完成数据桥接，数据适配器用于填充数据集
            DataSet ds = new DataSet();
            try
            {
                dt.Fill(ds);//将数据适配器中的内容填充至数据集
            }
            catch (Exception ex)
            {
                throw new Exception(ex.ToString());
            }
            return ds;
        }
        /// <summary>
        /// 执行数据查询，返回一项数据结果
        /// </summary>
        public static object GetScalar(SqlCommand cmd)
        {
            cmd.Connection = conn;
            object ob;
            try
            {
                conn.Open();
                ob = cmd.ExecuteScalar();//调用SqlCommand对象的ExecuteScalar方法,并返回一项数据结果
            }
            catch (Exception ex)
            {
                throw new DBException(ex);
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return ob;
        }
        /// <summary>
        /// 读数据库，提供对查询结果的影响
        /// </summary>
        public static SqlDataReader ExcuteReader(SqlCommand cmd)
        {
            cmd.Connection = conn;
            SqlDataReader read;
            try
            {
                conn.Open();
                read = cmd.ExecuteReader(CommandBehavior.CloseConnection);//查询数据库并返回结果集（当关闭对象连接时同时关闭数据库连接）
                return read;
            }
            catch (Exception ex)
            {
                throw new DBException(ex);
            }
        }
        /// <summary>
        /// 事务处理（主要处理在数据库中生成的T-SQL事务）
        /// </summary>
        public static SqlTransaction ExcuteSqlTransaction(SqlCommand cmd)
        {
            cmd.Connection = conn;
            SqlTransaction tran;
            try
            {
                conn.Open();
                tran = conn.BeginTransaction();//开始数据库事务操作
                cmd.Transaction = tran;//获取其中执行的事务
                return tran;
            }
            catch (Exception ex)
            {
                throw new DBException(ex);
            }
        }
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        public static void CloseConn()
        {
            if (conn.State == ConnectionState.Open)//如果数据库连接状态是打开状态
                conn.Close();//关闭数据库连接
        }
    }
}
